<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
  </body>
  <script type="text/javascript">
    //  1、 vue 双向绑定原理
    // 通过Object.defineProperty() 来劫持各个属性的setter， getter， 在数据变动时发布消息给订阅者， 触发相应的监听回调



    // 2、 说说vue的生命周期 每个阶段都在干什么
    //  从开始创建、 初始化数据、 编译模板、 挂载DOM - 渲染、 更新 - 渲染、 卸载等一系列的过程；
    // 有beforeCreate（ 创建前）， created（ 创建后）， beforeMount（ 挂载前）， mounted（ 挂载完成） 这几个钩子
    // beforeUpdate（ 数据更新前）， updated（ 数据更新后）, beforeDestroy（ 销毁前）， destroyed（ 销毁后）， deactivated（ < keep - alive > <
    //  /keep-alive>组件被移除时使用）




    // 3、 vue虚拟dom和真实dom哪个在先




    // 4、 什么是深拷贝 什么是浅拷贝 如何实现深拷贝 如何实现浅拷贝

    //  浅拷贝： 仅仅是指向被复制的内存地址， 只需要for in 循环一下， 用hasOwnProperty判断每个属性不是在原型链上的， 即可进行复制， 不考虑数据引用类型
    //浅拷贝简单实现例子：

    var obj = {
      a: 1,
      b: {
        f: {
          g: 1
        }
      },
      c: [1, 2, 3]
    };
    var y = Object.assign({}, obj);


    //深拷贝： 重新开辟一个内存空间， 需要递归拷贝对象里的引用， 直到子属性都为基本类型。 两个对象对应两个不同的地址， 修改一个对象的属性， 不会改变另一个对象的属性。
    // 简单实现方法：（ slice() 和concat() 都并非深拷贝）
    //JSON对象的parse和stringify， 满足基本的深拷贝需求， 对于正则表达式类型、 函数类型等无法进行深拷贝， 会抛弃对象的constructor

    // 方法实现：
    function deepCopy(obj1) {
      var obj2 = Array.isArray(obj1) ? [] : {};
      if (obj1 && typeof obj1 === "object") {
        for (var i in obj1) {
          var prop = obj1[i]; // 避免相互引用造成死循环，如obj1.a=obj
          if (prop == obj1) {
            continue;
          }
          if (obj1.hasOwnProperty(i)) {
            // 如果子属性为引用数据类型，递归复制
            if (prop && typeof prop === "object") {
              obj2[i] = (prop.constructor === Array) ? [] : {};
              arguments.callee(prop, obj2[i]); // 递归调用
            } else {
              // 如果是基本数据类型，只是简单的复制
              obj2[i] = prop;
            }
          }
        }
      }
      return obj2;
    }


    // 5、 什么是闭包 为啥要用闭包 闭包的缺点
    // 闭包： 即重用一个变量， 又保护变量不被污染的一种机制， 够读取其他函数内部变量的函数
    // 为啥要用闭包： 全局变量: 优: 可重用, 缺: 易被污染。 局部变量: 优: 仅函数内可用， 不会被污染。 缺: 不可重用!
    // 闭包的缺点： 比普通函数占用更多的内存， 闭包不在使用时， 要及时释放， 将引用内层函数对象的变量赋值为null


    // 6、 递归
  </script>
</html>
